const fs = require('fs');
const path = require('path');
const XLSX = require('xlsx');
class FileHandler {
    constructor(directory) {
        if (FileHandler.instance) {
            return FileHandler.instance;
        }

        this.directory = directory;
        FileHandler.instance = this;
    }

    createXLSX(worksheetData) {
        const workbook = XLSX.utils.book_new();
        const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);
        XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
        let path = this.directory;
        if (!fs.existsSync(path)) {
            fs.mkdirSync(path, { recursive: true }, (err) => {
                if (err) throw err;
                console.log(`目录 ${path} 已创建`);
            });
        }
        XLSX.writeFile(workbook, path + '/' + '数据.xlsx');
    }
    createDir(name) {
        let dir = this.directory + '/' + name;
        return new Promise((resolve, reject) => {
            fs.mkdir(dir, { recursive: true }, (err) => {
                if (err) {
                    console.error(err);
                    resolve(err); // 拒绝 Promise  
                } else {
                    console.log(`目录 ${dir} 已创建`);
                    resolve(dir); // 解析 Promise  
                }
            });
        });
    }
    // 读取文件的方法
    readFile(filename, callback) {
        const filePath = path.join(this.directory, '/' + filename);
        console.log('开始写入文件', filePath)
        fs.readFile(filePath, 'utf8', (err, data) => {
            if (err) {
                return callback(err);
            }
            console.log(`读取文件 ${filename} 的内容.`);
            callback('read', JSON.parse(data));
        });
    }

    // 写入文件的方法
    writeFile(filename, content, callback) {
        const filePath = path.join(this.directory, '/' + filename);
        console.log('开始创建文件', filePath)
        fs.writeFile(filePath, JSON.stringify(content), (err) => {
            if (err) {
                console.log('写入文件失败', err)
                return callback(err);
            }
            console.log(`文件 ${filename} 已写入内容.`);
            callback('write');
        });
    }

    // 检查文件是否存在，如果不存在则创建并写入默认内容，如果存在则读取内容
    async readOrCreateFile(title, defaultContent, callback) {
        const filePath = path.join(this.directory, title);
        const cataloguePath = path.join(this.directory);
        console.log(cataloguePath, 'cataloguePath')
        fs.access(cataloguePath, fs.constants.F_OK, async (err) => {
            if (err) {
                console.log('根目录不存在', err)
                // c创建文件夹
                await fs.mkdir(cataloguePath, {
                    recursive: true
                }, (err) => {
                    console.log(err, 'err')
                }
                )
                fn.call(this)
            } else {
                // 文件存在，读取内容
                // this.readFile(filename, callback);
                fn.call(this)
            }
        })
        function fn() {
            this.writeFile(title, defaultContent, (err) => {
                if (err) {
                    return callback(err);
                }
                callback(null, defaultContent);
            });
        }

    }
}
module.exports = FileHandler;
// // 示例使用方法
// const directory = './files'; // 文件夹路径
// const filename = 'example.txt'; // 文件名
// const defaultContent = '这是默认内容。'; // 默认内容

// const fileHandler1 = new FileHandler(directory);
// const fileHandler2 = new FileHandler(directory);

// console.log(fileHandler1 === fileHandler2); // true，两个实例相同

// fileHandler1.readOrCreateFile(filename, defaultContent, (err, content) => {
//     if (err) {
//         console.error('发生错误：', err);
//     } else {
//         console.log('文件内容：', content);
//     }
// });
